﻿/*
 * taskinfo.hpp
 *
 *  Created on: 2018年2月13日
 *      Author: work
 */

#ifndef _DM_OS_SYS_TASKINFO_HPP_
#define _DM_OS_SYS_TASKINFO_HPP_

#include <dm/export.hpp>

#ifndef DM_API_OS_SYS
#define DM_API_OS_SYS DM_API_IMPORT
#endif

#include <dm/os/sys/taskstate.hpp>
#include <dm/os/sys/process.hpp>
#include <dm/os/spinlock.hpp>

#include <dm/timestamp.hpp>
#include <dm/datetime.hpp>
#include <dm/fixdstring.hpp>
#include <iostream>

namespace dm{
namespace os{
namespace sys{

/**
 * 任务信息
 * 包含配置信息和动态信息
 */
struct DM_API_OS_SYS STaskInfo{
	enum{
		MaxLenOfProgram	= 128,		//!< 命令最大长度
		MaxLenOfParas		= 256,	//!< 参数表最大长度
		MaxLenOfDesc      	= 128,	//!< 描述的最大长度
		Unknow
	};

	/**
	 * 启动方式
	 */
	enum EStartMode{
		SmDeny = 0,		//!< 禁止执行
		SmDaemon,    	//!< 守护执行
		SmSingle,    	//!< 单次执行
		SmManual,    	//!< 手动执行
		SmSecondly,  	//!< 每秒执行
		SmMinutely,  	//!< 每分钟执行
		SmHourly,    	//!< 每小时执行
		SmDaily,    	//!< 每天执行
		SmMonthly,   	//!< 每月执行
		SmYearly,    	//!< 每年执行
		SmMondays,   	//!< 每周一执行
		SmTuesdays,  	//!< 每周二执行
		SmWednesdays,	//!< 每周三执行
		SmThursdays, 	//!< 每周四执行
		SmFridays,   	//!< 每周五执行
		SmSaturdays, 	//!< 每周六执行
		SmSundays,   	//!< 每周日执行

		SmUnknow     	//!< 未定义类型
	};

	/**
	 * 命令字符串类型
	 */
	typedef dm::CFixdString<MaxLenOfProgram> program_t;

	/**
	 * 参数字符串类型
	 */
	typedef dm::CFixdString<MaxLenOfParas> paras_t;

	typedef dm::CFixdString<MaxLenOfDesc> desc_t;

	STaskInfo():program(),paras(),desc(),delaySecs(0),
			time(),startMode(SmDeny),
			startTs(),refreshTs(),nextExecTs(),lastExamTs(),
			taskState(TsStoped),disable(false),pid(-1){
	}

	program_t program;				//!< 命令
	paras_t paras;			    	//!< 参数
	desc_t desc;					//!< 描述
	dm::CTimeStamp::s_t	delaySecs;	//!< 启动延时：秒
	dm::CDateTime 			time;	//!< 启动时刻
	EStartMode startMode;			//!< 启动方式

	CSpinlock lock;

	volatile dm::CTimeStamp			startTs;			//!< 开始执行时刻
	volatile dm::CTimeStamp     	refreshTs;			//!< 上次刷新时刻
	volatile dm::CTimeStamp			nextExecTs;			//!< 下次执行时刻
	volatile dm::CTimeStamp		 	lastExamTs;			//!< 最后检测时刻
	volatile ETaskState 			taskState;			//!< 任务状态
	volatile bool 					disable;			//!< 禁用任务
	volatile process_t 				pid;				//!< 进程号

	void init();

	bool ifExist();
	bool ifRunning();

	void stop();
	void enable(bool e=true);

	inline const char* startModeStr()const{
		return startMode2str(startMode);
	}

	static const char* startMode2str( const EStartMode& mode );
	friend std::ostream& operator<<( std::ostream& ostr,const STaskInfo& info );
};

}
}
}

#endif /* DM_RUNTIME_INCLUDE_DM_OS_SYS_TASKINFO_HPP_ */
